/*
 * pedidos.h
 *
 *  Created on: 26/10/2011
 *      Author: MadeyMaga
 */

#ifndef PEDIDOS_H_
#define PEDIDOS_H_

#define mod(x) (x >= 0) ? (x) : (-x)

#define FSCAN 1
#define SSTF 2
#define CONNECT 1
#define LISTEN 2

#define SUBE 1
#define BAJA 2

typedef enum {
	P_CONSOLA = 1,
	P_RAID,
	P_FS,
	P_FS_LISTENER,
} t_proceso;

typedef enum {
	LEER = 1,
	ESCRIBIR,
	CONSOLA,
} tipo_clase;

struct t_pedido
{
	int					sectorLogico;
	int 				pista;
	int 				sector;
	tipo_clase 			clase;
	char 				*buffer;
	int 				socket_id;
	t_proceso 			id_proceso;
	struct t_pedido		*siguiente;
};

void *hiloPedidos();

void agregarPedido(int i, tipo_clase clase,t_proceso proceso, char *buffer, int socket);

int insertarPedido(struct t_pedido **lista, struct t_pedido *pedido, int *cantidadDePedidos);

struct t_pedido* SSTF_proximoPedido(struct t_pedido **lista, struct t_pedido **anterior);

void atenderPedido(struct t_pedido *pedido, struct t_pedido *siguientePedido, int tamaniolista);

void armarPayload(struct t_pedido pedido, char **payload);

int recorrerSectores(struct t_pedido pedido, char **secRecorridos);

int recorrerPendientes(struct t_pedido *lista, int longitud, char **pedidosRecorridos);

void liberarPedido(struct t_pedido **lista);

void sacarPedidoSSTF(struct t_pedido **lista, struct t_pedido *antPedido);

void recorrerLista(struct t_pedido **lista, int *longitud);

void reordenarLista(struct t_pedido **lista, int longitud);

#endif /* PEDIDOS_H_ */
